package gestionarCliente;

import java.util.Collection;

import javax.jdo.JDOException;

import persistencia.Persistencia;
import persistencia.domain.Cliente;

import comun.Control;

/**
 * Clase que implementa el manejo de informacion de los clientes con persistencia.
 * 
 * @author tesisGeologia
 * 
 * @version 1.0
 */
public class ControlGestionarCliente extends Control {
	
	/**
	 * Contructor por defecto
	 */
	public ControlGestionarCliente(){
		
	}
	
	/**
	 * Inserta un cliente con persistencia. 
	 */ 
	public void insertarCliente(Cliente cliente) throws Exception{
		yaExiste=false;
		Persistencia persistencia = new Persistencia();
		persistencia.abrirTransaccion();
		try {
			if (persistencia.buscarObjeto(cliente.getClass(),"id=='"+cliente.getId()+"'")==null){
				persistencia.insertarObjeto(cliente);
			}
			else{
				yaExiste=true;
			}
			persistencia.cerrarTransaccion();
		}
		catch (Exception e) {
			System.out.println("Fatal error en ControlGestionarCliente insertar");
			persistencia.realizarRollback();
		}
	}
	
	/**
	 * Elimina una muestra con persistencia. 
	 */
	public void eliminarCliente(String ID) throws Exception {
		Persistencia persistencia = new Persistencia();
		persistencia.abrirTransaccion();
		try {
			Cliente cliente = new Cliente();
			Cliente auxcliente = (Cliente)persistencia.buscarObjeto(cliente.getClass(), "id=='"+ID+"'");
			persistencia.eliminarObjeto(auxcliente);
			persistencia.cerrarTransaccion();
		}
		catch (Exception e) {
			System.out.println("Error al eliminar");
			persistencia.realizarRollback();
		}
	}
			
	@SuppressWarnings("rawtypes")
	public void modificarCliente(String ID,Cliente data) throws Exception {
		yaExiste=false;
		Persistencia persistencia = new Persistencia();
		persistencia.abrirTransaccion();
		Cliente aux = new Cliente();
		try {
			Class claseCliente = aux.getClass();
			if (!ID.equals(data.getId())){
				if (persistencia.buscarObjeto(claseCliente, "id=='"+data.getId()+"'")==null){
					aux =(Cliente)persistencia.buscarObjeto(claseCliente, "dni=='"+ID+"'");
					aux.setNombre(data.getNombre());
					aux.setApellido(data.getApellido());
					aux.setId(data.getId());
					//aux.setTel(data.getTel());
				}else{
					yaExiste=true;
				}
			}
			else{
				aux =(Cliente)persistencia.buscarObjeto(claseCliente, "id=='"+ID+"'");
				aux.setNombre(data.getNombre());
				aux.setApellido(data.getApellido());
				aux.setId(data.getId());
				//aux.setTel(data.getTel());
			}
			persistencia.cerrarTransaccion();
		}
		catch (JDOException e) {
			System.out.println("Error al modificar porque ya existe esa clave");
			persistencia.realizarRollback();
		}
		catch (Exception e) {
			System.out.println("Error al modificar");
			persistencia.realizarRollback();
		}		
	}
	
	
	/**
	 * Retorna el cliente persistente que cumpla con el DNI pasado como parametro.
	 * @param ID
	 * @return
	 */
	public Cliente obtenerCliente (String ID) throws Exception{
		Persistencia persistencia = new Persistencia();
		persistencia.abrirTransaccion();
		Cliente aux = new Cliente();
		try {
			aux =(Cliente)persistencia.buscarObjeto(aux.getClass(), "id=='"+ID+"'");
			persistencia.cerrarTransaccion();
		}
		catch (Exception e) {
			persistencia.realizarRollback();
		}
		return aux;
	}
	
	/**
	 * Retorna todos los elementos de la clase pasada como persistente.
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Collection coleccionClientes(Class clase) throws Exception {
		Persistencia persistencia = new Persistencia();
		persistencia.abrirTransaccion();
		Collection<Cliente> aux = null;
		try {
			aux = (persistencia.buscarColeccion(clase));
			persistencia.cerrarTransaccion();
			System.out.println("La coleccion ha sido cargada");
		} catch (Exception e) {
			persistencia.realizarRollback();
		}
		return aux;
	}
}
